package com.mk.aline.aspectjdemo.aspectjs;

import android.util.Log;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

/**
 * Author：Administrator
 * Data: 2018/8/16 0016 11:23
 */
@Aspect
public class ConstractAspect {

    private static final String TAG = "test_ConstractAspect";

    @Pointcut("execution(public *..People.new(..))")
    public void getPeople() {
    }

    @Before("getPeople()")
    public void getPeopleInfo(JoinPoint mJoinPoint) {
        Log.e(TAG, "getPeopleInfo: " + mJoinPoint.getSignature().getName());
    }

    /**
     * 此处需要注意的一个点：
     * 在没有指定对哪一个变量做 get 切面处理时，如本例
     * 这个函数的返回值类型  和 你要获取变量的类型一致，不然的话不会完成切面的处理。
     * 这里对比 People 的mName 和 mAge 的的不同，这里不会对 getAge 进行切面处理
     *
     * @param mProceedingJoinPoint
     * @return
     * @throws Throwable
     */
    @Around("get(* *..People.*)")
    public String getPeopleName(ProceedingJoinPoint mProceedingJoinPoint) throws Throwable {
        Log.e(TAG, "getPeopleName: " + "start");
        Object mO = mProceedingJoinPoint.proceed();
        String mAge = mO.toString();
        Log.e(TAG, "getPeopleName: " + mAge);

        return mAge;
    }

    @Around("set(String com.mk.aline.aspectjdemo.Beans.People.mName) && !withincode(com.mk.aline.aspectjdemo.Beans.People.new(..))")
    public void setPeopel(ProceedingJoinPoint mProceedingJoinPoint) throws Throwable {
        Log.e(TAG, "setPeopel: " + "start");
        /**
         * 吐过不执行这句话，则赋值操作不会成功
         */
        mProceedingJoinPoint.proceed();
        Log.e(TAG, "setPeopel: " + "end");

    }


    @Before("handler(java.lang.Exception)")
    public void handlerMethod() {
        Log.e(TAG, "handlerMethod: 异常产生了");
    }
}
